'''
高阶函数
'''

'''函数名是一个变量'''
print(abs(-5))
# 函数名是一个变量，代表了函数本身
print(abs) #<built-in function abs>

r = abs
print(r)
print(r(-6))

# abs = 10
# print(abs)
# print(abs(-5))
r = 10
print(r)

'''
    高阶函数
        函数A接收函数B作为参数，那么函数A就被称为高阶函数
        函数A将函数B作为返回值，那么函数A就被称为高阶函数
'''
'''将函数作为参数传入'''

def sum(x,y,f):
    return f(x) + f(y)

print(sum(2,3,abs))
print(sum(-2,3,abs))

def power(x):
    return x*x

print(sum(-2,3,power))

'''高阶函数map/reduce'''

# [1,4,9,16,25]

s = [1,2,3,4,5]

r = map(power,s)
print(r)
print(list(r))

r = map(str,s)

from functools import reduce


def add(x,y):
    return x + y
r = reduce(add,s)
print(r)


'''函数作为返回值'''

def f(*args):   # 外部函数
    # 再定义一个函数
    def g():    # 内部函数
        s = 0
        for i in args: # 内部函数引用了外部函数的变量args
            s += i
        return s
    return g

m = f(1,2,3,4) #<function f.<locals>.g at 0x000000000266CF70>
print(m())